<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.23">
<title>Deployment to Kubernetes</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.square{list-style-type:square}
ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child{border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active,#footnotes .footnote a:first-of-type:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
<style>
/*! Asciidoctor Tabs | Copyright (c) 2018-present Dan Allen | MIT License */
.tabs {
    margin-bottom: 1.25em;
}

.tablist > ul {
    display: flex;
    flex-wrap: wrap;
    list-style: none;
    margin: 0;
    padding: 0;
}

.tablist > ul li {
    align-items: center;
    background-color: #fff;
    cursor: pointer;
    display: flex;
    font-weight: bold;
    line-height: 1.5;
    padding: 0.25em 1em;
    position: relative;
}

.tablist > ul li:focus-visible {
    outline: none;
}

.tablist.ulist,
.tablist.ulist > ul li {
    margin: 0;
}

.tablist.ulist > ul li + li {
    margin-left: 0.25em;
}

.tabs .tablist li::after {
    content: "";
    display: block;
    height: 1px;
    position: absolute;
    bottom: -1px;
    left: 0;
    right: 0;
}

.tabs.is-loading .tablist li:not(:first-child),
.tabs:not(.is-loading) .tablist li:not(.is-selected) {
    background-color: #f5f5f5;
}

.tabs.is-loading .tablist li:first-child::after,
.tabs:not(.is-loading) .tablist li.is-selected::after {
    background-color: #fff;
}

/*
.tabs:not(.is-loading) .tablist li,
.tabs:not(.is-loading) .tablist li::after {
  transition: background-color 200ms ease-in-out;
}
*/

.tablist > ul p {
    line-height: inherit;
    margin: 0;
}

.tabpanel {
    background-color: #fff;
    padding: 1.25em;
}

.tablist > ul li,
.tabpanel {
    border: 1px solid #dcdcdc;
}

.tablist > ul li {
    border-bottom: 0;
}

.tabs.is-loading .tabpanel + .tabpanel,
.tabs:not(.is-loading) .tabpanel.is-hidden {
    display: none;
}

.tabpanel > :first-child {
    margin-top: 0;
}

/* #content is a signature of the Asciidoctor standalone HTML output */
#content .tabpanel > :last-child,
#content .tabpanel > :last-child > :last-child,
#content .tabpanel > :last-child > :last-child > li:last-child > :last-child {
    margin-bottom: 0;
}

.tablecontainer {
    overflow-x: auto;
}

#content .tablecontainer {
    margin-bottom: 1.25em;
}

#content .tablecontainer > table.tableblock {
    margin-bottom: 0;
}
</style>
</head>
<body class="article">
<div id="header">
<h1>Deployment to Kubernetes</h1>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>This document describes how to use the Carvel packages to deploy Spring Cloud Data Flow, and it also has a <a href="#local-k8s-development">section</a> on creating local development cluster using minikube or kind.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="configuration-carvel">Deployment using Carvel</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Deployment of a carvel package requires the installation of tools and specific Kubernetes controllers. Then you will add the package repository to the cluster and install the application.</p>
</div>
<div class="paragraph">
<p>For local minikube or kind cluster you can use: <a href="#local-k8s-development">Configure Kubernetes for local development or testing</a>, and follow the instructions until the section <em>Deploy Spring Cloud Data Flow</em></p>
</div>
<div class="sect2">
<h3 id="_required_tools">Required Tools</h3>
<div class="ulist">
<ul>
<li>
<p><code>kubectl</code> - Kubernetes CLI (Install with <code>brew install kubectl</code>)</p>
</li>
<li>
<p><code>carvel</code> - Packaging and Deployment tools</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Carvel CLI can be installed using:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">wget -O- https://carvel.dev/install.sh | bash
# or with curl...
curl -L https://carvel.dev/install.sh | bash</code></pre>
</div>
</div>
<div class="paragraph">
<p>Alternative following the instructions at the bottom of the home page at <a href="https://carvel.dev/">carvel.dev</a></p>
</div>
<div class="paragraph">
<p>The following tools are use by the scripts.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>jq</code> - lightweight JSON parser</p>
</li>
<li>
<p><code>yq</code> - lightweight YAML parser</p>
</li>
<li>
<p><code>wget</code> - Invoke http requests.</p>
</li>
<li>
<p><code>dirname</code> provides the directory part of a filename.</p>
</li>
<li>
<p><code>readlink</code> provides absolute path of a relative link.</p>
</li>
</ul>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Some of these utilities are not installed in macOS or *nix by default but will be available from MacPorts or HomeBrew.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_scripts">Scripts</h3>
<div class="paragraph">
<p>These scripts assume you are connected to a Kubernetes cluster and <code>kubectl</code> is available.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Arguments</th>
<th class="tableblock halign-left valign-top">Descriptions</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>start-deploy.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">&lt;broker&gt; [scdf-type] [namespace] [release|snapshot]</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Configures environmental variables needs for the rest of the scripts. <code>BROKER</code>, <code>NS</code> and <code>SCDF_TYPE</code> are set. The default <code>NS</code> is <code>scdf</code>. The namespace will be created if it doesn&#8217;t exist by <code>setup-scdf-repo.sh</code>. The default <code>SCDF_TYPE</code> is <code>oss</code>. <em>release|snapshot</em> and <em>scdf-type</em> will determine the value of <code>PACKAGE_VERSION</code> set.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>prepare-cluster.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">N/A</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Installs cert-manager, secretgen-controller and kapp-controller</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>carvel-use-template.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">[scdf-type] (oss, pro)</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Creates <code>scdf-values.yml</code> in current directory based on <code>scdf-pro-values.yml</code> or <code>scdf-oss-values.yml</code></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>carvel-import-secret.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">&lt;secret-name&gt; &lt;namespace&gt; [secret-namespace] [--import|--placeholder]</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Creates an import secret, placeholder or import using secretgen-controller.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>setup-scdf-repo.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">[scdf-type] (oss, pro)</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Creates the namespace and installs the relevant Carvel package and credentials. If the optional <em>scdf-type</em> is not provided the environmental variable <code>SCDF_TYPE</code> will be used.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>configure-prometheus-proxy.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">&lt;host&gt; &lt;port&gt; [step]</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Configures Spring Boot Actuator properties for Data Flow, Skipper, Streams and Tasks. Default <code>step</code> is 10s</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>configure-database.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">&lt;app&gt; &lt;database&gt; &lt;url&gt; &lt;username/secret-name&gt;  [password/secret-username-key] [secret-password-key]</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>If only <em>secret-name</em> is provided then <em>secret-username-key</em> defaults to <code>username</code> and <em>secret-password-key</em> defaults to <code>password</code>.</p>
</div>
<div class="paragraph">
<p>The following 3 combinations are allowed after the <em>url</em>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>&lt;secret-name&gt;</p>
</li>
<li>
<p>&lt;secret-name&gt; &lt;username-key&gt;
&lt;password-key&gt;</p>
</li>
<li>
<p>&lt;username&gt; &lt;password&gt;</p>
</li>
</ul>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>deploy-scdf.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">[app-name]</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Deploys the application using the package and <code>scdf-values.yml</code> in the current directory.
The default <em>app-name</em> is <code>scdf-${SCDF_TYPE}</code>.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>update-scdf.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">[app-name]</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Updated the deployed application using a modified values file.
The default <em>app-name</em> is <code>scdf-${SCDF_TYPE}</code>.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export-dataflow-ip.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">N/A</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Will print the URL to access dataflow. If you use <code>source ./export-dataflow-ip.sh</code> it will export <code>DATAFLOW_URL</code> to be used by <code>register-apps.sh</code></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>register-apps.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">&lt;broker&gt; [stream-application-version]</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><em>broker</em> must be one of rabbit or kafka.
<em>stream-application-version</em> is optional and will install the latest version. The latest version is 2024.0.0</p>
</div></div></td>
</tr>
</tbody>
</table>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Take note that the registration of application in the <em>pro</em> version can take a few minutes since it retrieves all version information and metadata upfront.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_preparation">Preparation</h3>
<div class="paragraph">
<p>You will need to prepare a values file named scdf-values.yml
The following steps will provide help.</p>
</div>
<div class="sect3">
<h4 id="_prepare_configuration_parameters">Prepare Configuration parameters</h4>
<div class="paragraph">
<p>Executing the following script will configure the environmental variables needed.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">source ./carvel/start-deploy.sh &lt;broker&gt; &lt;namespace&gt; [scdf-type] [release|snapshot]</code></pre>
</div>
</div>
<div class="paragraph">
<p>Where:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>broker</code> is one of rabbitmq or kafka</p>
</li>
<li>
<p><code>namespace</code> A valid Kubernetes namespace other than <code>default</code></p>
</li>
<li>
<p><code>scdf-type</code> One of oss or pro. oss is the default.</p>
</li>
<li>
<p><code>release|snapshot</code> and <code>scdf-type</code> will determine the value of <code>PACKAGE_VERSION</code>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p><em>*The best option to ensure using the type and version of package intended is to modify <code>deploy/versions.yaml</code>*</em></p>
</div>
<div class="paragraph">
<p>The environmental variables can also be configured manually to override the values.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 27.2727%;">
<col style="width: 54.5454%;">
<col style="width: 18.1819%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Description</th>
<th class="tableblock halign-left valign-top">Default</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>PACKAGE_VERSION</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Version of Carvel package.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Release version</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>DATAFLOW_VERSION</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Version of Spring Cloud Data Flow</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2.11.2</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>DATAFLOW_PRO_VERSION</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Version of Spring Cloud Data Flow Pro</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">1.6.1</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SKIPPER_VERSION</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Version of Spring Cloud Skipper</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2.11.2</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>REGISTRY</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Url and repository of package registry. Format <code>&lt;private-registry-host/repo-name&gt;</code>. This will be used to prefix the carvel repo and package.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>docker.io/springcloud</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>BROKER</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">One of <code>kafka</code> or <code>rabbitmq</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>rabbitmq</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>DATABASE</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">One of <code>mariadb</code> or <code>postgresql</code>. The default is <code>postgresql</code>. This will only apply when you <code>deploy-local-database.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>postgresql</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>NS</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A Kubernetes namespace other than <code>default</code>.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>scdf</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SCDF_TYPE</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">One of <code>oss</code> or <code>pro</code>.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>oss</code></p></td>
</tr>
</tbody>
</table>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
The above environmental variables should only be provided if different from the default in <code>deploy/versions.yaml</code>
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="_prepare_configuration_file">Prepare Configuration file</h4>
<div class="paragraph">
<p>Create a file name <code>scdf-values.yml</code> by executing:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./carvel/carvel-use-template.sh</code></pre>
</div>
</div>
<div class="paragraph">
<p>Edit the file as needed to configure the deployment. The <code>deploy-local-</code> scripts will</p>
</div>
<div class="paragraph">
<p><em>Uses scdf-type previously selected.</em></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_prepare_cluster_and_add_repository">Prepare cluster and add repository</h3>
<div class="paragraph">
<p>Login to docker and optionally registry.tanzu.vmware.com for Spring Cloud Data Flow Pro.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell"># When deploying SCDF Pro.
export TANZU_DOCKER_USERNAME=&quot;&lt;tanzu-net-username&gt;&quot;
export TANZU_DOCKER_PASSWORD=&quot;&lt;tanzu-net-password&gt;&quot;
docker login --username $TANZU_DOCKER_USERNAME --password $TANZU_DOCKER_PASSWORD registry.packages.broadcom.com

# Always required to ensure you don't experience rate limiting with Docker HUB
export DOCKER_HUB_USERNAME=&quot;&lt;docker-hub-username&gt;&quot;
export DOCKER_HUB_PASSWORD=&quot;&lt;docker-hub-password&gt;&quot;
docker login --username $DOCKER_HUB_USERNAME --password $DOCKER_HUB_PASSWORD index.docker.io</code></pre>
</div>
</div>
<div class="paragraph">
<p>Install carvel kapp-controller, secretgen-controller and certmanager</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./carvel/prepare-cluster.sh</code></pre>
</div>
</div>
<div class="paragraph">
<p>Load scdf repo package for the <em>scdf-type</em></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./carvel/setup-scdf-repo.sh</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_install_supporting_services">Install supporting services</h3>
<div class="paragraph">
<p>In a production environment you should be using supported database and broker services or operators along with shared observability tools.</p>
</div>
<div class="paragraph">
<p>For local development or demonstration the following can be used to install database, broker and prometheus.</p>
</div>
<div class="sect3">
<h4 id="_deploy_local_database">Deploy local database.</h4>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./carvel/deploy-local-database.sh &lt;database&gt;  # <b class="conum">(1)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<ol>
<li>
<p><code>database</code> must be one of <code>postgresql</code> or <code>mariadb</code>. Default is postgresql or configure in <code>DATABASE</code> using <code>start-deploy.sh</code>.</p>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
This script updates <code>scdf-values.yml</code> with the correct secret name.
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="_deploy_local_message_broker">Deploy local message broker.</h4>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./carvel/deploy-local-broker.sh</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_deploy_local_prometheus_and_proxy">Deploy local Prometheus and proxy.</h4>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./carvel/deploy-local-prometheus.sh</code></pre>
</div>
</div>
<div class="paragraph">
<p><em>This script also configures the Grafana endpoint in `scdf-values.yml`</em></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_configure_prometheus_proxy">Configure Prometheus proxy</h3>
<div class="paragraph">
<p>In the case where and existing prometheus and prometheus proxy is deployed the proxy can be configured using:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./carvel/configure-prometheus-proxy.sh &lt;host&gt; &lt;port&gt; [step]</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_deploy_spring_cloud_data_flow">Deploy Spring Cloud Data Flow</h3>
<div class="paragraph">
<p>You can configure the before <code>register-apps.sh</code>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>STREAM_APPS_RT_VERSION</code> Stream Apps Release Train Version. <em>Default is 2022.0.0</em>.</p>
</li>
<li>
<p><code>STREAM_APPS_VERSION</code> Stream Apps Version. <em>Default is 4.0.0</em>.</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./carvel/deploy-scdf.sh
source ./carvel/export-dataflow-ip.sh
# expected output: Dataflow URL: &lt;url-to-access-dataflow&gt;
./carvel/register-apps.sh</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_update_deployed_application">Update deployed application.</h3>
<div class="paragraph">
<p>You can modify the values file used during installation and then update the deployment using <code>./carvel/update-scdf.sh</code></p>
</div>
</div>
<div class="sect2">
<h3 id="local-k8s-development">Configure Kubernetes for local development or testing</h3>
<div class="sect3">
<h4 id="_prerequisites">Prerequisites</h4>
<div class="paragraph">
<p>You will need to install kubectl and then kind or minikube for a local cluster.</p>
</div>
<div class="paragraph">
<p>All the examples assume you have cloned the <code>spring-cloud-dataflow</code> repository and are executing the scripts from <code>deploy/k8s</code>.</p>
</div>
<div class="paragraph">
<p>On macOS, you may need to install <code>realpath</code> from <a href="https://ports.macports.org/port/realpath/">Macports</a> or <code>brew install realpath</code></p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
The scripts require a shell like <code>bash</code> or <code>zsh</code> and should work on Linux, WSL 2 or macOS.
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="_steps">Steps</h4>
<div class="ulist">
<ul>
<li>
<p>Choose Kubernetes provider. Kind, Minikube or remote GKE or TMC.</p>
</li>
<li>
<p>Decide the namespace to use for deployment if not <code>default</code>.</p>
</li>
<li>
<p>Configure Kubernetes and loadbalancer.</p>
</li>
<li>
<p>Choose Broker with <code>export BROKER=kafka|rabbitmq</code></p>
</li>
<li>
<p>Build or Pull container images for Skipper and Data Flow Server.</p>
</li>
<li>
<p>Deploy and Launch Spring Cloud Data Flow.</p>
</li>
<li>
<p>Export Data Flow Server address to env.</p>
</li>
</ul>
</div>
<div class="sect4">
<h5 id="_kubernetes_provider">Kubernetes Provider</h5>
<div class="paragraph">
<p><em>How do I choose between minikube and kind? kind will generally provide quicker setup and teardown time than Minikube. There is little to choose in terms of performance between the 2 apart from being able to configure limits on CPUs and memory when deploying minikube. So in the case where you have memory constraints or need to enforce memory limitations Minikube will be a better option.</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_kubectl">Kubectl</h5>
<div class="paragraph">
<p>You will need to <a href="https://kubernetes.io/docs/tasks/tools/">install</a> kubectl in order to configure the Kubernetes cluster</p>
</div>
</div>
<div class="sect4">
<h5 id="_kind">Kind</h5>
<div class="paragraph">
<p>Kind is Kubernetes in docker and ideal for local development.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://kind.sigs.k8s.io/docs/user/quick-start/">Installation</a></p>
</li>
<li>
<p><a href="https://kind.sigs.k8s.io/docs/user/loadbalancer/">LoadBalancer</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The LoadBalancer will be installed by the <code>configure-k8s.sh</code> script by will require an update to a yaml file to provide the address range available to the LoadBalancer.</p>
</div>
</div>
<div class="sect4">
<h5 id="_minikube">Minikube</h5>
<div class="paragraph">
<p>Minikube uses one of a selection of drivers to provide a virtualization environment.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://minikube.sigs.k8s.io/docs/start/">Installation</a></p>
</li>
<li>
<p><a href="https://minikube.sigs.k8s.io/docs/start/#loadbalancer-deployments">LoadBalancer</a></p>
</li>
</ul>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Delete existing Minikube installation if you have any. <code>minikube delete</code>
</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="_remote_tmc_cluster">Remote TMC Cluster</h5>
<div class="paragraph">
<p><a href="https://tanzu.vmware.com/mission-control">Tanzu Mission Control</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_building_and_loading_containers">Building and loading containers.</h4>
<div class="paragraph">
<p>For local development you need control of the containers used in the local environment.</p>
</div>
<div class="paragraph">
<p>In order to ensure to manage the specific versions of data flow and skipper containers you can set SKIPPER_VERSION and DATAFLOW_VERSION environmental variable and then invoke <code>./images/pull-dataflow.sh</code> and <code>./images/pull-skipper.sh</code> or if you want to use a locally built application you can invoke <code>./images/build-skipper-image.sh</code> and <code>./images/build-dataflow.sh</code></p>
</div>
</div>
<div class="sect3">
<h4 id="_configure_k8s_environment">Configure k8s environment</h4>
<div class="paragraph">
<p>You can invoke one of the following scripts to choose the type of installation you are targeting:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./k8s/use-kind.sh [&lt;namespace&gt;] [&lt;database&gt;] [&lt;broker&gt;]
./k8s/use-mk-docker.sh [&lt;namespace&gt;] [&lt;database&gt;] [&lt;broker&gt;]
./k8s/use-mk-kvm2.sh [&lt;namespace&gt;] [&lt;database&gt;] [&lt;broker&gt;]
./k8s/use-mk.sh &lt;driver&gt; [&lt;namespace&gt;] [&lt;database&gt;] [&lt;broker&gt;] # <b class="conum">(1)</b>
./k8s/use-tmc.sh &lt;cluster-name&gt; [&lt;namespace&gt;] [&lt;database&gt;] [&lt;broker&gt;]
./k8s/use-gke.sh &lt;cluster-name&gt; [&lt;namespace&gt;] [&lt;database&gt;] [&lt;broker&gt;]</code></pre>
</div>
</div>
<div class="colist arabic">
<ol>
<li>
<p>&lt;driver&gt; must be one of <code>kvm2</code>, <code>docker</code>, <code>vmware</code>, <code>virtualbox</code>, <code>vmwarefusion</code> or <code>hyperkit</code>. <code>docker</code> is the recommended option for local development.</p>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<code>&lt;namespace&gt;</code> will be <code>default</code> if not provided. The default <code>&lt;database&gt;</code> is <code>postgresql</code> and the default <code>&lt;broker&gt;</code> is <code>kafka</code>.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Since these scripts export environmental variable they need to be executes as in the following example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">source ./k8s/use-mk-docker.sh postgresql rabbitmq --namespace test-ns</code></pre>
</div>
</div>
<div class="sect4">
<h5 id="_tmc_or_gke_cluster_in_cloud">TMC or GKE Cluster in Cloud</h5>
<div class="paragraph">
<p>The cluster must exist before use, and you should use the relevant cli to login before executing <code>source ./k8s/use-gke.sh</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_create_local_cluster">Create Local Cluster.</h5>
<div class="paragraph">
<p>The following script will create the local cluster.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell"># Optionally add to control cpu and memory allocation.
export MK_ARGS=&quot;--cpus=8 --memory=12g&quot;
./k8s/configure-k8s.sh</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>For <strong>kind</strong> follow instruction to update <code>./k8s/yaml/metallb-configmap.yaml</code> and then apply using <code>kubectl apply -f ./k8s/yaml/metallb-configmap.yaml</code></p>
</li>
<li>
<p>For <strong>minikube</strong> launch a new shell and execute <code>minikube tunnel</code></p>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_deploy_spring_cloud_data_flow_2">Deploy Spring Cloud Data Flow.</h5>
<div class="paragraph">
<p>The <code>use-*</code> scripts will configure the values of BROKER and DATABASE.</p>
</div>
<div class="sect5">
<h6 id="_configure_broker">Configure Broker</h6>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">export BROKER=&lt;broker&gt; # <b class="conum">(1)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<ol>
<li>
<p>&lt;broker&gt; one of <code>kafka</code> or <code>rabbitmq</code></p>
</li>
</ol>
</div>
</div>
<div class="sect5">
<h6 id="_configure_database">Configure Database</h6>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">export DATABASE=&lt;database&gt; # <b class="conum">(1)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<ol>
<li>
<p>&lt;database&gt; one of <code>mariadb</code> or <code>postgresql</code></p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Docker credentials need to be configured for Kubernetes to pull the various container images.</p>
</div>
<div class="paragraph">
<p>For Docker Hub you can create a personal free account and use a personal access token as your password.</p>
</div>
<div class="paragraph">
<p>Test your docker login using <code>./k8s/docker-login.sh</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">export DOCKER_SERVER=https://docker.io
export DOCKER_USER=&lt;docker-userid&gt;
export DOCKER_PASSWORD=&lt;docker-password&gt;
export DOCKER_EMAIL=&lt;email-of-docker-use&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Set the version of Spring Cloud Data Flow and Skipper.</p>
</div>
<div class="paragraph">
<p>This example shows the versions of the current development snapshot.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">export DATAFLOW_VERSION=2.11.5-SNAPSHOT
export SKIPPER_VERSION=2.11.5-SNAPSHOT</code></pre>
</div>
</div>
<div class="paragraph">
<p>Before you can install SCDF you will need to pull the following images to ensure they are present for uploading to the k8s cluster.</p>
</div>
<div class="paragraph">
<p>You can configure the before <code>pull-app-images</code> and <code>install-scdf</code>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>STREAM_APPS_RT_VERSION</code> Stream Apps Release Train Version. <em>Default is 2022.0.0</em>.</p>
</li>
<li>
<p><code>STREAM_APPS_VERSION</code> Stream Apps Version. <em>Default is 4.0.0</em>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Use:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./images/pull-app-images.sh
./images/pull-dataflow.sh
./images/pull-skipper.sh
./images/pull-composed-task-runner.sh</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./k8s/install-scdf.sh
source ./k8s/export-dataflow-ip.sh</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
You can now execute scripts from <code>./shell</code> to deploy some simple streams and tasks. You can also run <code>./shell/shell.sh</code> to run the Spring Cloud Data Flow Shell.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>If you want to start fresh you use the following to delete the SCDF deployment and then run <code>./k8s/install-scdf.sh</code> to install it again.</p>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_delete_the_deployment_from_the_cluster">Delete the deployment from the cluster.</h5>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./k8s/delete-scdf.sh</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_delete_the_cluster">Delete the cluster</h5>
<div class="paragraph">
<p>This script will also delete the TMC cluster if you have configured one.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">./k8s/destroy-k8s.sh</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_utilities">Utilities</h4>
<div class="paragraph">
<p>The following list of utilities may prove useful.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 80%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a href="https://k9scli.io/">k9s</a></code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">k9s is a text based monitor to explore the Kubernetes cluster.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a href="https://github.com/boz/kail">kail</a></code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Extra and tail the logs of various pods based on various naming criteria.</p></td>
</tr>
</tbody>
</table>
<div class="sect4">
<h5 id="_kail"><code>kail</code></h5>
<div class="ulist">
<ul>
<li>
<p>Using kail to log activity related to a specific stream.</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">kail --label=spring-group-id=&lt;stream-name&gt;</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Using kail to log all pods in specific namespace.</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">kail --ns=&lt;namespace&gt;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_scripts_2">Scripts</h4>
<div class="paragraph">
<p>Some of the scripts apply to local containers as well and can be found in <code>src/local</code>, the Kubernetes specific scripts are in <code>deploy/k8s</code></p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 66.6667%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Script</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./images/build-app-images.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Build all images of Restaurant Sample Stream Apps</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./images/pull-app-images.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Pull all images of Restaurant Sample Stream Apps from Docker Hub</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./images/pull-dataflow.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Pull dataflow from DockerHub based on <code>DATAFLOW_VERSION</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./images/pull-scdf-pro.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Pull Dataflow Pro from Tanzu Network based on <code>SCDF_PRO_VERSION</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./images/pull-skipper.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Pull Skipper from DockerHub base on the <code>SKIPPER_VERSION</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./images/build-dataflow-image.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Build a docker image from the local repo of Dataflow</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./images/build-scdf-pro-image.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Build a docker image from the local repo of Dataflow Pro. Set <code>USE_PRO=true</code> in environment to use Dataflow Pro</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./images/build-skipper-image.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Build a docker image from the local repo of Skipper.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./k8s/configure-k8s.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Configure the Kubernetes environment based on your configuration of K8S_DRIVER.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./k8s/delete-scdf.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Delete all Kubernetes resources create by the deployment.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./k8s/destroy-k8s.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Delete cluster, kind or minikube.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./k8s/export-dataflow-ip.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Export the url of the data flow server to <code>DATAFLOW_IP</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./k8s/export-http-url.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Export the url of the http source of a specific flow by name to <code>HTTP_APP_URL</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./k8s/install-scdf.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Configure and deploy all the containers for Spring Cloud Dataflow</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./k8s/load-images.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Load all container images required by tests into kind or minikube to ensure you have control over what is used.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./k8s/load-image.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Load a specific container image into local kind or minikube.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>src/local/local-k8s-acceptance-tests.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Execute acceptance tests against cluster where <code>DATAFLOW_IP</code> is pointing.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>./k8s/register-apps.sh</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Register the Task and Stream apps used by the unit tests.</p></td>
</tr>
</tbody>
</table>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
Please report any errors with the scripts along with detail information about the relevant environment.
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2024-04-11 13:22:15 +0200
</div>
</div>
<script>
;(function () { /*! Asciidoctor Tabs | Copyright (c) 2018-present Dan Allen | MIT License */
  'use strict'

  var config = (document.currentScript || {}).dataset || {}
  var forEach = Array.prototype.forEach

  init(document.querySelectorAll('.tabs'))

  function init (tabsBlocks) {
    if (!tabsBlocks.length) return
    forEach.call(tabsBlocks, function (tabs) {
      var syncIds = tabs.classList.contains('is-sync') ? {} : undefined
      var tablist = tabs.querySelector('.tablist ul')
      tablist.setAttribute('role', 'tablist')
      var start
      forEach.call(tablist.querySelectorAll('li'), function (tab, idx) {
        tab.tabIndex = -1
        tab.setAttribute('role', tab.classList.add('tab') || 'tab')
        var id, anchor, syncId
        if (!(id = tab.id) && (anchor = tab.querySelector('a[id]'))) {
          id = tab.id = anchor.parentNode.removeChild(anchor).id
        }
        var panel = id && tabs.querySelector('.tabpanel[aria-labelledby~="' + id + '"]')
        if (!panel) return idx ? undefined : toggleSelected(tab, true) // invalid state
        syncIds && (((syncId = tab.textContent.trim()) in syncIds) ? (syncId = undefined) : true) &&
        (syncIds[(tab.dataset.syncId = syncId)] = tab)
        idx || (syncIds && (start = { tab: tab, panel: panel })) ? toggleHidden(panel, true) : toggleSelected(tab, true)
        tab.setAttribute('aria-controls', panel.id)
        panel.setAttribute('role', 'tabpanel')
        var onClick = syncId === undefined ? activateTab : activateTabSync
        tab.addEventListener('click', onClick.bind({ tabs: tabs, tab: tab, panel: panel }))
      })
      if (!tabs.closest('.tabpanel')) {
        forEach.call(tabs.querySelectorAll('.tabpanel table.tableblock'), function (table) {
          var container = Object.assign(document.createElement('div'), { className: 'tablecontainer' })
          table.parentNode.insertBefore(container, table).appendChild(table)
        })
      }
      if (start) {
        var syncGroupId
        for (var i = 0, lst = tabs.classList, len = lst.length, className; i !== len; i++) {
          if (!(className = lst.item(i)).startsWith('data-sync-group-id=')) continue
          tabs.dataset.syncGroupId = syncGroupId = lst.remove(className) || className.slice(19).replace(/\u00a0/g, ' ')
          break
        }
        if (syncGroupId === undefined) tabs.dataset.syncGroupId = syncGroupId = Object.keys(syncIds).sort().join('|')
        var preferredSyncId = 'syncStorageKey' in config &&
          window[(config.syncStorageScope || 'local') + 'Storage'].getItem(config.syncStorageKey + '-' + syncGroupId)
        var tab = preferredSyncId && syncIds[preferredSyncId]
        tab && Object.assign(start, { tab: tab, panel: document.getElementById(tab.getAttribute('aria-controls')) })
        toggleSelected(start.tab, true) || toggleHidden(start.panel, false)
      }
    })
    onHashChange()
    toggleClassOnEach(tabsBlocks, 'is-loading', 'remove')
    window.setTimeout(toggleClassOnEach.bind(null, tabsBlocks, 'is-loaded', 'add'), 0)
    window.addEventListener('hashchange', onHashChange)
  }

  function activateTab (e) {
    var tab = this.tab
    var tabs = this.tabs || (this.tabs = tab.closest('.tabs'))
    var panel = this.panel || (this.panel = document.getElementById(tab.getAttribute('aria-controls')))
    querySelectorWithSiblings(tabs, '.tablist .tab', 'tab').forEach(function (el) {
      toggleSelected(el, el === tab)
    })
    querySelectorWithSiblings(tabs, '.tabpanel', 'tabpanel').forEach(function (el) {
      toggleHidden(el, el !== panel)
    })
    if (!this.isSync && 'syncStorageKey' in config && 'syncGroupId' in tabs.dataset) {
      var storageKey = config.syncStorageKey + '-' + tabs.dataset.syncGroupId
      window[(config.syncStorageScope || 'local') + 'Storage'].setItem(storageKey, tab.dataset.syncId)
    }
    if (!e) return
    var loc = window.location
    var hashIdx = loc.hash ? loc.href.indexOf('#') : -1
    if (~hashIdx) window.history.replaceState(null, '', loc.href.slice(0, hashIdx))
    e.preventDefault()
  }

  function activateTabSync (e) {
    activateTab.call(this, e)
    var thisTabs = this.tabs
    var thisTab = this.tab
    var initialY = thisTabs.getBoundingClientRect().y
    forEach.call(document.querySelectorAll('.tabs'), function (tabs) {
      if (tabs === thisTabs || tabs.dataset.syncGroupId !== thisTabs.dataset.syncGroupId) return
      querySelectorWithSiblings(tabs, '.tablist .tab', 'tab').forEach(function (tab) {
        if (tab.dataset.syncId === thisTab.dataset.syncId) activateTab.call({ tabs: tabs, tab: tab, isSync: true })
      })
    })
    var shiftedBy = thisTabs.getBoundingClientRect().y - initialY
    if (shiftedBy && (shiftedBy = Math.round(shiftedBy))) window.scrollBy({ top: shiftedBy, behavior: 'instant' })
  }

  function querySelectorWithSiblings (scope, selector, siblingClass) {
    var el = scope.querySelector(selector)
    if (!el) return []
    var result = [el]
    while ((el = el.nextElementSibling) && el.classList.contains(siblingClass)) result.push(el)
    return result
  }

  function toggleClassOnEach (elements, className, method) {
    forEach.call(elements, function (el) {
      el.classList[method](className)
    })
  }

  function toggleHidden (el, state) {
    el.classList[(el.hidden = state) ? 'add' : 'remove']('is-hidden')
  }

  function toggleSelected (el, state) {
    el.setAttribute('aria-selected', '' + state)
    el.classList[state ? 'add' : 'remove']('is-selected')
    el.tabIndex = state ? 0 : -1
  }

  function onHashChange () {
    var id = window.location.hash.slice(1)
    if (!id) return
    var tab = document.getElementById(~id.indexOf('%') ? decodeURIComponent(id) : id)
    if (!(tab && tab.classList.contains('tab'))) return
    'syncId' in tab.dataset ? activateTabSync.call({ tab: tab }) : activateTab.call({ tab: tab })
  }
})()
</script>
</body>
</html>
